
#include "config/type.h"
#include "drivers/atkbdmap.h"
#include "lib/buffer.h"
#include "lib/stdin.h"
#include "lib/stdout.h"

bool stdin_enabled = false;

buffer *stdio_buffer;

// 输入缓冲区初始化
void stdin_init() {
    stdio_buffer = std_buffer_create();
    stdin_on();
}

// 输入缓冲区清空
void stdin_clear()
{
    std_buffer_clear(stdio_buffer);
}

// 输入缓冲区开启
void stdin_on()
{
    if (stdin_enabled)
        return;
    stdin_enabled = true;
}

// 输入缓冲区关闭
void stdin_off()
{
    if (!stdin_enabled)
        return;
    stdin_enabled = false;
}

// 从缓冲区获取一字符
char getc()
{
    byte c = 0;
    stdin_on();
    c = std_buffer_wait_char(stdio_buffer);
    stdin_off();
    return c;
}

// 从缓冲区获取一字符串
int gets_k(char *str, int size)
{
    int n = 0;
    stdin_on();
    n = std_buffer_wait_line(stdio_buffer, str, size);
    stdin_off();
    return n;
}

// 处理键盘驱动得到的输入键 c
// 目前只支持 Backspace 和输入字符。
void stdin_kbd_handler(char c, int keynum) {
    if (!stdin_enabled) {
        // 仅在开启输入缓冲区时可用
        pr_debug(stdin_kbd_handler, "stdin buffer disabled");
        return;
    }
    
    if (c == '\b') {
        // 对于退格符
        std_buffer_pop_back(stdio_buffer);
        // pr_debug(stdin_kbd_handler, "finished: std_buffer_pop_back(stdio_buffer)");
        printk("%c", '\b');
        printk("%c", ' ');
        printk("%c", '\b');
    } else {
        // 输入字符入缓冲区
        std_buffer_put(stdio_buffer, c);
        printk("%c", c);
    }
}
